﻿#include "SpinBox.h"
#include <QPainterPath>

// ArrowButton 构造函数
ArrowButton::ArrowButton(bool isUp, QWidget *parent) : QPushButton(parent), isUp(isUp)
{
    // 默认背景颜色和箭头颜色
    arrowBackground = QColor(240, 240, 240); // 默认背景颜色
    arrowColor = Qt::black; // 默认箭头颜色

    // 设置按钮无边框
    setFlat(true);
}

// 设置箭头背景颜色
void ArrowButton::setArrowBackground(const QColor &color)
{
    arrowBackground = color;
    update(); // 触发重绘
}

// 设置箭头颜色
void ArrowButton::setArrowColor(const QColor &color)
{
    arrowColor = color;
    update(); // 触发重绘
}

// ArrowButton 的绘制事件
void ArrowButton::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 绘制背景
    painter.setBrush(arrowBackground);
    painter.setPen(Qt::NoPen);
    painter.drawRect(rect());

    // 绘制箭头
    painter.setPen(arrowColor);
    painter.setBrush(arrowColor);

    QRect arrowRect = rect().adjusted(2, 2, -2, -2); // 箭头绘制区域
    QPainterPath path;
    if (isUp)
    {
        path.moveTo(arrowRect.center().x(), arrowRect.top());
        path.lineTo(arrowRect.left(), arrowRect.bottom());
        path.lineTo(arrowRect.right(), arrowRect.bottom());
    }
    else
    {
        path.moveTo(arrowRect.center().x(), arrowRect.bottom());
        path.lineTo(arrowRect.left(), arrowRect.top());
        path.lineTo(arrowRect.right(), arrowRect.top());
    }
    path.closeSubpath();
    painter.drawPath(path);
}

// SpinBox 构造函数
SpinBox::SpinBox(QWidget *parent) : QSpinBox(parent)
{
    // 设置边框透明
    setFrame(false);

    // 创建自定义按钮
    upButton = new ArrowButton(true, this);
    downButton = new ArrowButton(false, this);

    // 连接按钮点击信号到槽函数
    connect(upButton, &QPushButton::clicked, this, &SpinBox::stepUp);
    connect(downButton, &QPushButton::clicked, this, &SpinBox::stepDown);

    // 初始化按钮位置
    updateButtonGeometry();
}

// 设置箭头背景颜色
void SpinBox::setArrowBackground(const QColor &color)
{
    upButton->setArrowBackground(color);
    downButton->setArrowBackground(color);
}

// 设置箭头颜色
void SpinBox::setArrowColor(const QColor &color)
{
    upButton->setArrowColor(color);
    downButton->setArrowColor(color);
}

// SpinBox 的绘制事件
void SpinBox::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置背景颜色
    QColor backgroundColor = QColor(240, 240, 240); // Fluent UI 风格的背景颜色
    QRect rect = this->rect();

    // 绘制圆角背景
    painter.setBrush(backgroundColor);
    painter.setPen(Qt::NoPen);
    painter.drawRoundedRect(rect, 5, 5); // 5 是圆角半径

    // 绘制文本
    QStyleOptionSpinBox option;
    initStyleOption(&option);
    QString text = this->text();

    painter.setPen(Qt::black); // 设置文本颜色
    painter.drawText(rect.adjusted(5, 0, -5, 0), Qt::AlignLeft | Qt::AlignVCenter, text);
}

// SpinBox 的大小调整事件
void SpinBox::resizeEvent(QResizeEvent *event)
{
    QSpinBox::resizeEvent(event);
    updateButtonGeometry();
}

// 增加值的槽函数
void SpinBox::stepUp()
{
    stepBy(1); // 增加值
}

// 减少值的槽函数
void SpinBox::stepDown()
{
    stepBy(-1); // 减少值
}

// 更新按钮位置和大小
void SpinBox::updateButtonGeometry()
{
    int buttonWidth = 20; // 按钮宽度固定为 20
    int buttonHeight = height() / 2; // 按钮高度为 SpinBox 高度的一半

    // 上按钮位置
    upButton->setGeometry(width() - buttonWidth, 0, buttonWidth, buttonHeight);
    // 下按钮位置
    downButton->setGeometry(width() - buttonWidth, buttonHeight, buttonWidth, buttonHeight);

    // 重绘按钮
    upButton->update();
    downButton->update();
}
